use std::borrow::BorrowMut;
use std::sync::{Arc, Mutex};
use std::time::Duration;

/// Rust 的内存安全特性也非常适合用于并发，保证线程安全
/// 两个标签trait 一-Send和Sync-一来对类型进行分类
/// · 如果类型 T 实现了 Send，就是告诉编译器该类型的实例可以在线程间安全传递所有权。
/// · 如果类型T实现了Sync，就是向编译器表明该类型的实例在多线程并发中不可能导致内存不安全 ， 所以可以安全地跨线程共享。
pub fn start() {
    let data = Arc::new(Mutex::new(vec![1, 2, 3]));
    for i in 0..3 {
        let temp = data.clone();
        std::thread::spawn(move || {
            temp.lock().unwrap().borrow_mut()[i] += 1;
        });
    }
    std::thread::sleep(Duration::from_millis(3));
    println!("{:?}", data);

    let x = String::from("hello");
    let z;
    let y = String::from("rust");
    z = foo(&x, &y);
    println!("{}", z);
}

fn foo<'a, 'b: 'a>(x: &'a str, b: &'b str) -> &'a str {
    if x.len() > b.len() {
        x
    } else {
        b
    }
}
